package com.yitiao.data_algorithms.leetcode.editor.cn;

import com.yitiao.data_algorithms.leetcode.editor.cn.base.ListNode;

import java.util.HashMap;

/**
给你一个链表的头节点 head，请你编写代码，反复删去链表中由 总和 值为 0 的连续节点组成的序列，直到不存在这样的序列为止。 

 删除完毕后，请你返回最终结果链表的头节点。 

 

 你可以返回任何满足题目要求的答案。 

 （注意，下面示例中的所有序列，都是对 ListNode 对象序列化的表示。） 

 示例 1： 

 输入：head = [1,2,-3,3,1]
输出：[3,1]
提示：答案 [1,2,1] 也是正确的。
 

 示例 2： 

 输入：head = [1,2,3,-3,4]
输出：[1,2,4]
 

 示例 3： 

 输入：head = [1,2,3,-3,-2]
输出：[1]
 

 

 提示： 

 
 给你的链表中可能有 1 到 1000 个节点。 
 对于链表中的每个节点，节点的值：-1000 <= node.val <= 1000. 
 
 Related Topics 哈希表 链表 👍 149 👎 0

*/
// 从链表中删去总和值为零的连续节点
// 2022-02-16 16:09:58
class RemoveZeroSumConsecutiveNodesFromLinkedList{
    //leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeZeroSumSublists(ListNode head) {
        // 前缀和
        HashMap<Integer, ListNode> map = new HashMap<>();
        ListNode cur=head;
        ListNode dummy = new ListNode(0, head);
        map.put(0,dummy);

        int sum = 0;
        while (cur!=null){
            sum+=cur.val;
            if (map.containsKey(sum)){
               // 删除
                ListNode node = map.get(sum);
                ListNode del = node.next;
                // 从 node.next到cur全部删除
                node.next=cur.next;
                // 维护map ,循环删除前缀和
                int delSumKey=sum;
                while (del!=cur){
                    // 注意这几步的顺序
                    delSumKey+=del.val;
                    map.remove(delSumKey);
                    del=del.next;
                }
            }else {
                map.put(sum,cur);
            }
            cur=cur.next;
        }
        return dummy.next;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}